Code coverage report for src/view-compiler.js

Statements: 13.41% (22 / 164)      Branches: 0% (0 / 102)      Functions: 40% (6 / 15)      Lines: 13.58% (22 / 162)      Ignored: none     

All files » src/ » view-compiler.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 3521     1   1   1       1                                                         1         1   1   3   1     1 1 1 1   1 1           1       1                                                                                                       1                                                       1                                                                                                                                                                                                                                                                                                                                                                                                   1     1        
System.register(['./resource-registry', './view-factory', './binding-language'], function (_export) {
  'use strict';
 
  var ResourceRegistry, ViewFactory, BindingLanguage, nextInjectorId, defaultCompileOptions, hasShadowDOM, needsTemplateFixup, ViewCompiler;
 
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function getNextInjectorId() {
    return ++nextInjectorId;
  }
 
  function configureProperties(instruction, resources) {
    var type = instruction.type,
        attrName = instruction.attrName,
        attributes = instruction.attributes,
        property,
        key,
        value;
 
    var knownAttribute = resources.mapAttribute(attrName);
    if (knownAttribute && attrName in attributes && knownAttribute !== attrName) {
      attributes[knownAttribute] = attributes[attrName];
      delete attributes[attrName];
    }
 
    for (key in attributes) {
      value = attributes[key];
 
      if (typeof value !== 'string') {
        property = type.attributes[key];
 
        if (property !== undefined) {
          value.targetProperty = property.name;
        } else {
          value.targetProperty = key;
        }
      }
    }
  }
 
  function makeIntoInstructionTarget(element) {
    var value = element.getAttribute('class');
    element.setAttribute('class', value ? value += ' au-target' : 'au-target');
  }
 
  return {
    setters: [function (_resourceRegistry) {
      ResourceRegistry = _resourceRegistry.ResourceRegistry;
    }, function (_viewFactory) {
      ViewFactory = _viewFactory.ViewFactory;
    }, function (_bindingLanguage) {
      BindingLanguage = _bindingLanguage.BindingLanguage;
    }],
    execute: function () {
      nextInjectorId = 0;
      defaultCompileOptions = { targetShadowDOM: false };
      hasShadowDOM = !!HTMLElement.prototype.createShadowRoot;
      needsTemplateFixup = !('content' in document.createElement('template'));
 
      ViewCompiler = (function () {
        function ViewCompiler(bindingLanguage) {
          _classCallCheck(this, ViewCompiler);
 
          this.bindingLanguage = bindingLanguage;
        }
 
        ViewCompiler.inject = function inject() {
          return [BindingLanguage];
        };
 
        ViewCompiler.prototype.compile = function compile(templateOrFragment, resources) {
          var options = arguments[2] === undefined ? defaultCompileOptions : arguments[2];
 
          var instructions = [],
              targetShadowDOM = options.targetShadowDOM,
              content,
              part,
              factory,
              temp;
 
          targetShadowDOM = targetShadowDOM && hasShadowDOM;
 
          if (options.beforeCompile) {
            options.beforeCompile(templateOrFragment);
          }
 
          if (typeof templateOrFragment === 'string') {
            temp = document.createElement('template');
            temp.innerHTML = templateOrFragment;
 
            if (needsTemplateFixup) {
              temp.content = document.createDocumentFragment();
              while (temp.firstChild) {
                temp.content.appendChild(temp.firstChild);
              }
            }
 
            templateOrFragment = temp;
          }
 
          if (templateOrFragment.content) {
            part = templateOrFragment.getAttribute('part');
            content = document.adoptNode(templateOrFragment.content, true);
            //TODO: read in element instructions
          } else {
            content = templateOrFragment;
          }
 
          this.compileNode(content, resources, instructions, templateOrFragment, 'root', !targetShadowDOM);
 
          content.insertBefore(document.createComment('<view>'), content.firstChild);
          content.appendChild(document.createComment('</view>'));
 
          var factory = new ViewFactory(content, instructions, resources);
 
          if (part) {
            factory.part = part;
          }
 
          return factory;
        };
 
        ViewCompiler.prototype.compileNode = function compileNode(node, resources, instructions, parentNode, parentInjectorId, targetLightDOM) {
          switch (node.nodeType) {
            case 1:
              //element node
              return this.compileElement(node, resources, instructions, parentNode, parentInjectorId, targetLightDOM);
            case 3:
              //text node
              var expression = this.bindingLanguage.parseText(resources, node.textContent);
              if (expression) {
                var marker = document.createElement('au-marker');
                marker.className = 'au-target';
                (node.parentNode || parentNode).insertBefore(marker, node);
                node.textContent = ' ';
                instructions.push({ contentExpression: expression });
              }
              return node.nextSibling;
            case 11:
              //document fragment node
              var currentChild = node.firstChild;
              while (currentChild) {
                currentChild = this.compileNode(currentChild, resources, instructions, node, parentInjectorId, targetLightDOM);
              }
              break;
          }
 
          return node.nextSibling;
        };
 
        ViewCompiler.prototype.compileElement = function compileElement(node, resources, instructions, parentNode, parentInjectorId, targetLightDOM) {
          var tagName = node.tagName.toLowerCase(),
              attributes = node.attributes,
              expressions = [],
              behaviorInstructions = [],
              providers = [],
              bindingLanguage = this.bindingLanguage,
              liftingInstruction,
              viewFactory,
              type,
              elementInstruction,
              elementProperty,
              i,
              ii,
              attr,
              attrName,
              attrValue,
              instruction,
              info,
              property,
              knownAttribute;
 
          if (tagName === 'content') {
            if (targetLightDOM) {
              instructions.push({
                parentInjectorId: parentInjectorId,
                contentSelector: true,
                selector: node.getAttribute('select'),
                suppressBind: true
              });
              makeIntoInstructionTarget(node);
            }
            return node.nextSibling;
          } else if (tagName === 'template') {
            viewFactory = this.compile(node, resources);
            viewFactory.part = node.getAttribute('part');
          } else {
            type = resources.getElement(tagName);
            if (type) {
              elementInstruction = { type: type, attributes: {} };
              elementInstruction.anchorIsContainer = !node.hasAttribute('containerless') && !type.containerless;
              behaviorInstructions.push(elementInstruction);
            }
          }
 
          for (i = 0, ii = attributes.length; i < ii; ++i) {
            attr = attributes[i];
            attrName = attr.name;
            attrValue = attr.value;
            info = bindingLanguage.inspectAttribute(resources, attrName, attrValue);
            type = resources.getAttribute(info.attrName);
            elementProperty = null;
 
            if (type) {
              //do we have an attached behavior?
              knownAttribute = resources.mapAttribute(info.attrName); //map the local name to real name
              if (knownAttribute) {
                property = type.attributes[knownAttribute];
 
                if (property) {
                  //if there's a defined property
                  info.defaultBindingMode = property.defaultBindingMode; //set the default binding mode
 
                  if (!info.command && !info.expression) {
                    // if there is no command or detected expression
                    info.command = property.hasOptions ? 'options' : null; //and it is an optons property, set the options command
                  }
                }
              }
            } else if (elementInstruction) {
              //or if this is on a custom element
              elementProperty = elementInstruction.type.attributes[info.attrName];
              if (elementProperty) {
                //and this attribute is a custom property
                info.defaultBindingMode = elementProperty.defaultBindingMode; //set the default binding mode
 
                if (!info.command && !info.expression) {
                  // if there is no command or detected expression
                  info.command = elementProperty.hasOptions ? 'options' : null; //and it is an optons property, set the options command
                }
              }
            }
 
            if (elementProperty) {
              instruction = bindingLanguage.createAttributeInstruction(resources, node, info, elementInstruction);
            } else {
              instruction = bindingLanguage.createAttributeInstruction(resources, node, info);
            }
 
            if (instruction) {
              //HAS BINDINGS
              if (instruction.alteredAttr) {
                type = resources.getAttribute(instruction.attrName);
              }
 
              if (instruction.discrete) {
                //ref binding or listener binding
                expressions.push(instruction);
              } else {
                //attribute bindings
                if (type) {
                  //templator or attached behavior found
                  instruction.type = type;
                  configureProperties(instruction, resources);
 
                  if (type.liftsContent) {
                    //template controller
                    instruction.originalAttrName = attrName;
                    liftingInstruction = instruction;
                    break;
                  } else {
                    //attached behavior
                    behaviorInstructions.push(instruction);
                  }
                } else if (elementProperty) {
                  //custom element attribute
                  elementInstruction.attributes[info.attrName].targetProperty = elementProperty.name;
                } else {
                  //standard attribute binding
                  expressions.push(instruction.attributes[instruction.attrName]);
                }
              }
            } else {
              //NO BINDINGS
              if (type) {
                //templator or attached behavior found
                instruction = { attrName: attrName, type: type, attributes: {} };
                instruction.attributes[resources.mapAttribute(attrName)] = attrValue;
 
                if (type.liftsContent) {
                  //template controller
                  instruction.originalAttrName = attrName;
                  liftingInstruction = instruction;
                  break;
                } else {
                  //attached behavior
                  behaviorInstructions.push(instruction);
                }
              } else if (elementProperty) {
                //custom element attribute
                elementInstruction.attributes[attrName] = attrValue;
              }
 
              //else; normal attribute; do nothing
            }
          }
 
          if (liftingInstruction) {
            liftingInstruction.viewFactory = viewFactory;
            node = liftingInstruction.type.compile(this, resources, node, liftingInstruction, parentNode);
            makeIntoInstructionTarget(node);
            instructions.push({
              anchorIsContainer: false,
              parentInjectorId: parentInjectorId,
              expressions: [],
              behaviorInstructions: [liftingInstruction],
              viewFactory: liftingInstruction.viewFactory,
              providers: [liftingInstruction.type.target]
            });
          } else {
            for (i = 0, ii = behaviorInstructions.length; i < ii; ++i) {
              instruction = behaviorInstructions[i];
              instruction.type.compile(this, resources, node, instruction, parentNode);
              providers.push(instruction.type.target);
            }
 
            var injectorId = behaviorInstructions.length ? getNextInjectorId() : false;
 
            if (expressions.length || behaviorInstructions.length) {
              makeIntoInstructionTarget(node);
              instructions.push({
                anchorIsContainer: elementInstruction ? elementInstruction.anchorIsContainer : true,
                isCustomElement: !!elementInstruction,
                injectorId: injectorId,
                parentInjectorId: parentInjectorId,
                expressions: expressions,
                behaviorInstructions: behaviorInstructions,
                providers: providers
              });
            }
 
            if (elementInstruction && elementInstruction.type.skipContentProcessing) {
              return node.nextSibling;
            }
 
            var currentChild = node.firstChild;
            while (currentChild) {
              currentChild = this.compileNode(currentChild, resources, instructions, node, injectorId || parentInjectorId, targetLightDOM);
            }
          }
 
          return node.nextSibling;
        };
 
        return ViewCompiler;
      })();
 
      _export('ViewCompiler', ViewCompiler);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL3ZpZXctY29tcGlsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O3NEQUlJLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsWUFBWSxFQUNaLGtCQUFrQixFQXNDVCxZQUFZOzs7O0FBcEN6QixXQUFTLGlCQUFpQixHQUFFO0FBQzFCLFdBQU8sRUFBRSxjQUFjLENBQUM7R0FDekI7O0FBRUQsV0FBUyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFDO0FBQ2xELFFBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJO1FBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUTtRQUMvQixVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVU7UUFDbkMsUUFBUTtRQUFFLEdBQUc7UUFBRSxLQUFLLENBQUM7O0FBRXpCLFFBQUksY0FBYyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEQsUUFBRyxjQUFjLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxjQUFjLEtBQUssUUFBUSxFQUFDO0FBQ3pFLGdCQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELGFBQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQzdCOztBQUVELFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBQztBQUNwQixXQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUV4QixVQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBQztBQUMzQixnQkFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRWhDLFlBQUcsUUFBUSxLQUFLLFNBQVMsRUFBQztBQUN4QixlQUFLLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENB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QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDekM7O0FBRUQsZ0JBQUksVUFBVSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQzs7QUFFM0UsZ0JBQUcsV0FBVyxDQUFDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUM7QUFDbkQsdUNBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsMEJBQVksQ0FBQyxJQUFJLENBQUM7QUFDaEIsaUNBQWlCLEVBQUUsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLEdBQUcsSUFBSTtBQUNuRiwrQkFBZSxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7QUFDckMsMEJBQVUsRUFBRSxVQUFVO0FBQ3RCLGdDQUFnQixFQUFFLGdCQUFnQjtBQUNsQywyQkFBVyxFQUFFLFdBQVc7QUFDeEIsb0NBQW9CLEVBQUUsb0JBQW9CO0FBQzFDLHlCQUFTLEVBQUUsU0FBUztlQUNyQixDQUFDLENBQUM7YUFDSjs7QUFFRCxnQkFBRyxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUM7QUFDckUscUJBQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUN6Qjs7QUFFRCxnQkFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNuQyxtQkFBTyxZQUFZLEVBQUU7QUFDbkIsMEJBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDOUg7V0FDRjs7QUFFRCxpQkFBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3pCOztlQWhQVSxZQUFZOzs7OEJBQVosWUFBWSIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy92aWV3LWNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZXNvdXJjZVJlZ2lzdHJ5fSBmcm9tICcuL3Jlc291cmNlLXJlZ2lzdHJ5JztcbmltcG9ydCB7Vmlld0ZhY3Rvcnl9IGZyb20gJy4vdmlldy1mYWN0b3J5JztcbmltcG9ydCB7QmluZGluZ0xhbmd1YWdlfSBmcm9tICcuL2JpbmRpbmctbGFuZ3VhZ2UnO1xuXG52YXIgbmV4dEluamVjdG9ySWQgPSAwLFxuICAgIGRlZmF1bHRDb21waWxlT3B0aW9ucyA9IHsgdGFyZ2V0U2hhZG93RE9NOmZhbHNlIH0sXG4gICAgaGFzU2hhZG93RE9NID0gISFIVE1MRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdCxcbiAgICBuZWVkc1RlbXBsYXRlRml4dXAgPSAhKCdjb250ZW50JyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTtcblxuZnVuY3Rpb24gZ2V0TmV4dEluamVjdG9ySWQoKXtcbiAgcmV0dXJuICsrbmV4dEluamVjdG9ySWQ7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZVByb3BlcnRpZXMoaW5zdHJ1Y3Rpb24sIHJlc291cmNlcyl7XG4gIHZhciB0eXBlID0gaW5zdHJ1Y3Rpb24udHlwZSxcbiAgICAgIGF0dHJOYW1lID0gaW5zdHJ1Y3Rpb24uYXR0ck5hbWUsXG4gICAgICBhdHRyaWJ1dGVzID0gaW5zdHJ1Y3Rpb24uYXR0cmlidXRlcyxcbiAgICAgIHByb3BlcnR5LCBrZXksIHZhbHVlO1xuXG4gIHZhciBrbm93bkF0dHJpYnV0ZSA9IHJlc291cmNlcy5tYXBBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICBpZihrbm93bkF0dHJpYnV0ZSAmJiBhdHRyTmFtZSBpbiBhdHRyaWJ1dGVzICYmIGtub3duQXR0cmlidXRlICE9PSBhdHRyTmFtZSl7XG4gICAgYXR0cmlidXRlc1trbm93bkF0dHJpYnV0ZV0gPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcbiAgICBkZWxldGUgYXR0cmlidXRlc1thdHRyTmFtZV07XG4gIH1cblxuICBmb3Ioa2V5IGluIGF0dHJpYnV0ZXMpe1xuICAgIHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuXG4gICAgaWYodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyl7XG4gICAgICBwcm9wZXJ0eSA9IHR5cGUuYXR0cmlidXRlc1trZXldO1xuXG4gICAgICBpZihwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgdmFsdWUudGFyZ2V0UHJvcGVydHkgPSBwcm9wZXJ0eS5uYW1lO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHZhbHVlLnRhcmdldFByb3BlcnR5ID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlSW50b0luc3RydWN0aW9uVGFyZ2V0KGVsZW1lbnQpe1xuICB2YXIgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKHZhbHVlID8gdmFsdWUgKz0gJyBhdS10YXJnZXQnIDogJ2F1LXRhcmdldCcpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFZpZXdDb21waWxlciB7XG4gIHN0YXRpYyBpbmplY3QoKSB7IHJldHVybiBbQmluZGluZ0xhbmd1YWdlXTsgfVxuICBjb25zdHJ1Y3RvcihiaW5kaW5nTGFuZ3VhZ2Upe1xuICAgIHRoaXMuYmluZGluZ0xhbmd1YWdlID0gYmluZGluZ0xhbmd1YWdlO1xuICB9XG5cbiAgY29tcGlsZSh0ZW1wbGF0ZU9yRnJhZ21lbnQsIHJlc291cmNlcywgb3B0aW9ucz1kZWZhdWx0Q29tcGlsZU9wdGlvbnMpe1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBbXSxcbiAgICAgICAgdGFyZ2V0U2hhZG93RE9NID0gb3B0aW9ucy50YXJnZXRTaGFkb3dET00sXG4gICAgICAgIGNvbnRlbnQsIHBhcnQsIGZhY3RvcnksIHRlbXA7XG5cbiAgICB0YXJnZXRTaGFkb3dET00gPSB0YXJnZXRTaGFkb3dET00gJiYgaGFzU2hhZG93RE9NO1xuXG4gICAgaWYob3B0aW9ucy5iZWZvcmVDb21waWxlKXtcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ29tcGlsZSh0ZW1wbGF0ZU9yRnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGlmKHR5cGVvZiB0ZW1wbGF0ZU9yRnJhZ21lbnQgPT09ICdzdHJpbmcnKXtcbiAgICAgIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgdGVtcC5pbm5lckhUTUwgPSB0ZW1wbGF0ZU9yRnJhZ21lbnQ7XG5cbiAgICAgIGlmKG5lZWRzVGVtcGxhdGVGaXh1cCl7XG4gICAgICAgIHRlbXAuY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgd2hpbGUodGVtcC5maXJzdENoaWxkKXtcbiAgICAgICAgICB0ZW1wLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGVtcC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wbGF0ZU9yRnJhZ21lbnQgPSB0ZW1wO1xuICAgIH1cblxuICAgIGlmKHRlbXBsYXRlT3JGcmFnbWVudC5jb250ZW50KXtcbiAgICAgIHBhcnQgPSB0ZW1wbGF0ZU9yRnJhZ21lbnQuZ2V0QXR0cmlidXRlKCdwYXJ0Jyk7XG4gICAgICBjb250ZW50ID0gZG9jdW1lbnQuYWRvcHROb2RlKHRlbXBsYXRlT3JGcmFnbWVudC5jb250ZW50LCB0cnVlKTtcbiAgICAgIC8vVE9ETzogcmVhZCBpbiBlbGVtZW50IGluc3RydWN0aW9uc1xuICAgIH1lbHNle1xuICAgICAgY29udGVudCA9IHRlbXBsYXRlT3JGcmFnbWVudDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBpbGVOb2RlKGNvbnRlbnQsIHJlc291cmNlcywgaW5zdHJ1Y3Rpb25zLCB0ZW1wbGF0ZU9yRnJhZ21lbnQsICdyb290JywgIXRhcmdldFNoYWRvd0RPTSk7XG5cbiAgICBjb250ZW50Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVDb21tZW50KCc8dmlldz4nKSwgY29udGVudC5maXJzdENoaWxkKTtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJzwvdmlldz4nKSk7XG5cbiAgICB2YXIgZmFjdG9yeSA9IG5ldyBWaWV3RmFjdG9yeShjb250ZW50LCBpbnN0cnVjdGlvbnMsIHJlc291cmNlcyk7XG5cbiAgICBpZihwYXJ0KXtcbiAgICAgIGZhY3RvcnkucGFydCA9IHBhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhY3Rvcnk7XG4gIH1cblxuICBjb21waWxlTm9kZShub2RlLCByZXNvdXJjZXMsIGluc3RydWN0aW9ucywgcGFyZW50Tm9kZSwgcGFyZW50SW5qZWN0b3JJZCwgdGFyZ2V0TGlnaHRET00pe1xuICAgIHN3aXRjaChub2RlLm5vZGVUeXBlKXtcbiAgICAgIGNhc2UgMTogLy9lbGVtZW50IG5vZGVcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUVsZW1lbnQobm9kZSwgcmVzb3VyY2VzLCBpbnN0cnVjdGlvbnMsIHBhcmVudE5vZGUsIHBhcmVudEluamVjdG9ySWQsIHRhcmdldExpZ2h0RE9NKTtcbiAgICAgIGNhc2UgMzogLy90ZXh0IG5vZGVcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSAgdGhpcy5iaW5kaW5nTGFuZ3VhZ2UucGFyc2VUZXh0KHJlc291cmNlcywgbm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgIGlmKGV4cHJlc3Npb24pe1xuICAgICAgICAgIHZhciBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdS1tYXJrZXInKTtcbiAgICAgICAgICBtYXJrZXIuY2xhc3NOYW1lID0gJ2F1LXRhcmdldCc7XG4gICAgICAgICAgKG5vZGUucGFyZW50Tm9kZSB8fCBwYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUobWFya2VyLCBub2RlKTtcbiAgICAgICAgICBub2RlLnRleHRDb250ZW50ID0gJyAnO1xuICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKHsgY29udGVudEV4cHJlc3Npb246ZXhwcmVzc2lvbiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICAgIGNhc2UgMTE6IC8vZG9jdW1lbnQgZnJhZ21lbnQgbm9kZVxuICAgICAgICB2YXIgY3VycmVudENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkKSB7XG4gICAgICAgICAgY3VycmVudENoaWxkID0gdGhpcy5jb21waWxlTm9kZShjdXJyZW50Q2hpbGQsIHJlc291cmNlcywgaW5zdHJ1Y3Rpb25zLCBub2RlLCBwYXJlbnRJbmplY3RvcklkLCB0YXJnZXRMaWdodERPTSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gIH1cblxuICBjb21waWxlRWxlbWVudChub2RlLCByZXNvdXJjZXMsIGluc3RydWN0aW9ucywgcGFyZW50Tm9kZSwgcGFyZW50SW5qZWN0b3JJZCwgdGFyZ2V0TGlnaHRET00pe1xuICAgIHZhciB0YWdOYW1lID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIGF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXMsXG4gICAgICAgIGV4cHJlc3Npb25zID0gW10sXG4gICAgICAgIGJlaGF2aW9ySW5zdHJ1Y3Rpb25zID0gW10sXG4gICAgICAgIHByb3ZpZGVycyA9IFtdLFxuICAgICAgICBiaW5kaW5nTGFuZ3VhZ2UgPSB0aGlzLmJpbmRpbmdMYW5ndWFnZSxcbiAgICAgICAgbGlmdGluZ0luc3RydWN0aW9uLCB2aWV3RmFjdG9yeSwgdHlwZSwgZWxlbWVudEluc3RydWN0aW9uLFxuICAgICAgICBlbGVtZW50UHJvcGVydHksIGksIGlpLCBhdHRyLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBpbnN0cnVjdGlvbiwgaW5mbyxcbiAgICAgICAgcHJvcGVydHksIGtub3duQXR0cmlidXRlO1xuXG4gICAgaWYodGFnTmFtZSA9PT0gJ2NvbnRlbnQnKXtcbiAgICAgIGlmKHRhcmdldExpZ2h0RE9NKXtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgIHBhcmVudEluamVjdG9ySWQ6IHBhcmVudEluamVjdG9ySWQsXG4gICAgICAgICAgY29udGVudFNlbGVjdG9yOiB0cnVlLFxuICAgICAgICAgIHNlbGVjdG9yOm5vZGUuZ2V0QXR0cmlidXRlKCdzZWxlY3QnKSxcbiAgICAgICAgICBzdXBwcmVzc0JpbmQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIG1ha2VJbnRvSW5zdHJ1Y3Rpb25UYXJnZXQobm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9IGVsc2UgaWYodGFnTmFtZSA9PT0gJ3RlbXBsYXRlJyl7XG4gICAgICB2aWV3RmFjdG9yeSA9IHRoaXMuY29tcGlsZShub2RlLCByZXNvdXJjZXMpO1xuICAgICAgdmlld0ZhY3RvcnkucGFydCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdwYXJ0Jyk7XG4gICAgfSBlbHNle1xuICAgICAgdHlwZSA9IHJlc291cmNlcy5nZXRFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgaWYodHlwZSl7XG4gICAgICAgIGVsZW1lbnRJbnN0cnVjdGlvbiA9IHt0eXBlOnR5cGUsIGF0dHJpYnV0ZXM6e319O1xuICAgICAgICBlbGVtZW50SW5zdHJ1Y3Rpb24uYW5jaG9ySXNDb250YWluZXIgPSAhbm9kZS5oYXNBdHRyaWJ1dGUoJ2NvbnRhaW5lcmxlc3MnKSAmJiAhdHlwZS5jb250YWluZXJsZXNzO1xuICAgICAgICBiZWhhdmlvckluc3RydWN0aW9ucy5wdXNoKGVsZW1lbnRJbnN0cnVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yKGkgPSAwLCBpaSA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIGluZm8gPSBiaW5kaW5nTGFuZ3VhZ2UuaW5zcGVjdEF0dHJpYnV0ZShyZXNvdXJjZXMsIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgdHlwZSA9IHJlc291cmNlcy5nZXRBdHRyaWJ1dGUoaW5mby5hdHRyTmFtZSk7XG4gICAgICBlbGVtZW50UHJvcGVydHkgPSBudWxsO1xuXG4gICAgICBpZih0eXBlKXsgLy9kbyB3ZSBoYXZlIGFuIGF0dGFjaGVkIGJlaGF2aW9yP1xuICAgICAgICBrbm93bkF0dHJpYnV0ZSA9IHJlc291cmNlcy5tYXBBdHRyaWJ1dGUoaW5mby5hdHRyTmFtZSk7IC8vbWFwIHRoZSBsb2NhbCBuYW1lIHRvIHJlYWwgbmFtZVxuICAgICAgICBpZihrbm93bkF0dHJpYnV0ZSl7XG4gICAgICAgICAgcHJvcGVydHkgPSB0eXBlLmF0dHJpYnV0ZXNba25vd25BdHRyaWJ1dGVdO1xuXG4gICAgICAgICAgaWYocHJvcGVydHkpeyAvL2lmIHRoZXJlJ3MgYSBkZWZpbmVkIHByb3BlcnR5XG4gICAgICAgICAgICBpbmZvLmRlZmF1bHRCaW5kaW5nTW9kZSA9IHByb3BlcnR5LmRlZmF1bHRCaW5kaW5nTW9kZTsgLy9zZXQgdGhlIGRlZmF1bHQgYmluZGluZyBtb2RlXG5cbiAgICAgICAgICAgIGlmKCFpbmZvLmNvbW1hbmQgJiYgIWluZm8uZXhwcmVzc2lvbil7IC8vIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgb3IgZGV0ZWN0ZWQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICBpbmZvLmNvbW1hbmQgPSBwcm9wZXJ0eS5oYXNPcHRpb25zID8gJ29wdGlvbnMnIDogbnVsbDsgLy9hbmQgaXQgaXMgYW4gb3B0b25zIHByb3BlcnR5LCBzZXQgdGhlIG9wdGlvbnMgY29tbWFuZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfWVsc2UgaWYoZWxlbWVudEluc3RydWN0aW9uKXsgLy9vciBpZiB0aGlzIGlzIG9uIGEgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudFByb3BlcnR5ID0gZWxlbWVudEluc3RydWN0aW9uLnR5cGUuYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXTtcbiAgICAgICAgaWYoZWxlbWVudFByb3BlcnR5KXsgLy9hbmQgdGhpcyBhdHRyaWJ1dGUgaXMgYSBjdXN0b20gcHJvcGVydHlcbiAgICAgICAgICBpbmZvLmRlZmF1bHRCaW5kaW5nTW9kZSA9IGVsZW1lbnRQcm9wZXJ0eS5kZWZhdWx0QmluZGluZ01vZGU7IC8vc2V0IHRoZSBkZWZhdWx0IGJpbmRpbmcgbW9kZVxuXG4gICAgICAgICAgaWYoIWluZm8uY29tbWFuZCAmJiAhaW5mby5leHByZXNzaW9uKXsgLy8gaWYgdGhlcmUgaXMgbm8gY29tbWFuZCBvciBkZXRlY3RlZCBleHByZXNzaW9uXG4gICAgICAgICAgICBpbmZvLmNvbW1hbmQgPSBlbGVtZW50UHJvcGVydHkuaGFzT3B0aW9ucyA/ICdvcHRpb25zJyA6IG51bGw7IC8vYW5kIGl0IGlzIGFuIG9wdG9ucyBwcm9wZXJ0eSwgc2V0IHRoZSBvcHRpb25zIGNvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZWxlbWVudFByb3BlcnR5KXtcbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBiaW5kaW5nTGFuZ3VhZ2UuY3JlYXRlQXR0cmlidXRlSW5zdHJ1Y3Rpb24ocmVzb3VyY2VzLCBub2RlLCBpbmZvLCBlbGVtZW50SW5zdHJ1Y3Rpb24pO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGluc3RydWN0aW9uID0gYmluZGluZ0xhbmd1YWdlLmNyZWF0ZUF0dHJpYnV0ZUluc3RydWN0aW9uKHJlc291cmNlcywgbm9kZSwgaW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGlmKGluc3RydWN0aW9uKXsgLy9IQVMgQklORElOR1NcbiAgICAgICAgaWYoaW5zdHJ1Y3Rpb24uYWx0ZXJlZEF0dHIpe1xuICAgICAgICAgIHR5cGUgPSByZXNvdXJjZXMuZ2V0QXR0cmlidXRlKGluc3RydWN0aW9uLmF0dHJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGluc3RydWN0aW9uLmRpc2NyZXRlKXsgLy9yZWYgYmluZGluZyBvciBsaXN0ZW5lciBiaW5kaW5nXG4gICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChpbnN0cnVjdGlvbik7XG4gICAgICAgIH1lbHNleyAvL2F0dHJpYnV0ZSBiaW5kaW5nc1xuICAgICAgICAgIGlmKHR5cGUpeyAvL3RlbXBsYXRvciBvciBhdHRhY2hlZCBiZWhhdmlvciBmb3VuZFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICBjb25maWd1cmVQcm9wZXJ0aWVzKGluc3RydWN0aW9uLCByZXNvdXJjZXMpO1xuXG4gICAgICAgICAgICBpZih0eXBlLmxpZnRzQ29udGVudCl7IC8vdGVtcGxhdGUgY29udHJvbGxlclxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5vcmlnaW5hbEF0dHJOYW1lID0gYXR0ck5hbWU7XG4gICAgICAgICAgICAgIGxpZnRpbmdJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1lbHNleyAvL2F0dGFjaGVkIGJlaGF2aW9yXG4gICAgICAgICAgICAgIGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1lbHNlIGlmKGVsZW1lbnRQcm9wZXJ0eSkgeyAvL2N1c3RvbSBlbGVtZW50IGF0dHJpYnV0ZVxuICAgICAgICAgICAgZWxlbWVudEluc3RydWN0aW9uLmF0dHJpYnV0ZXNbaW5mby5hdHRyTmFtZV0udGFyZ2V0UHJvcGVydHkgPSBlbGVtZW50UHJvcGVydHkubmFtZTtcbiAgICAgICAgICB9IGVsc2V7IC8vc3RhbmRhcmQgYXR0cmlidXRlIGJpbmRpbmdcbiAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbnN0cnVjdGlvbi5hdHRyTmFtZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfWVsc2V7IC8vTk8gQklORElOR1NcbiAgICAgICAgaWYodHlwZSl7IC8vdGVtcGxhdG9yIG9yIGF0dGFjaGVkIGJlaGF2aW9yIGZvdW5kXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24gPSB7IGF0dHJOYW1lOmF0dHJOYW1lLCB0eXBlOnR5cGUsIGF0dHJpYnV0ZXM6e30gfTtcbiAgICAgICAgICBpbnN0cnVjdGlvbi5hdHRyaWJ1dGVzW3Jlc291cmNlcy5tYXBBdHRyaWJ1dGUoYXR0ck5hbWUpXSA9IGF0dHJWYWx1ZTtcblxuICAgICAgICAgIGlmKHR5cGUubGlmdHNDb250ZW50KXsgLy90ZW1wbGF0ZSBjb250cm9sbGVyXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5vcmlnaW5hbEF0dHJOYW1lID0gYXR0ck5hbWU7XG4gICAgICAgICAgICBsaWZ0aW5nSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1lbHNleyAvL2F0dGFjaGVkIGJlaGF2aW9yXG4gICAgICAgICAgICBiZWhhdmlvckluc3RydWN0aW9ucy5wdXNoKGluc3RydWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1lbHNlIGlmKGVsZW1lbnRQcm9wZXJ0eSl7IC8vY3VzdG9tIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudEluc3RydWN0aW9uLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gYXR0clZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9lbHNlOyBub3JtYWwgYXR0cmlidXRlOyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYobGlmdGluZ0luc3RydWN0aW9uKXtcbiAgICAgIGxpZnRpbmdJbnN0cnVjdGlvbi52aWV3RmFjdG9yeSA9IHZpZXdGYWN0b3J5O1xuICAgICAgbm9kZSA9IGxpZnRpbmdJbnN0cnVjdGlvbi50eXBlLmNvbXBpbGUodGhpcywgcmVzb3VyY2VzLCBub2RlLCBsaWZ0aW5nSW5zdHJ1Y3Rpb24sIHBhcmVudE5vZGUpO1xuICAgICAgbWFrZUludG9JbnN0cnVjdGlvblRhcmdldChub2RlKTtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgYW5jaG9ySXNDb250YWluZXI6IGZhbHNlLFxuICAgICAgICBwYXJlbnRJbmplY3RvcklkOiBwYXJlbnRJbmplY3RvcklkLFxuICAgICAgICBleHByZXNzaW9uczogW10sXG4gICAgICAgIGJlaGF2aW9ySW5zdHJ1Y3Rpb25zOiBbbGlmdGluZ0luc3RydWN0aW9uXSxcbiAgICAgICAgdmlld0ZhY3Rvcnk6IGxpZnRpbmdJbnN0cnVjdGlvbi52aWV3RmFjdG9yeSxcbiAgICAgICAgcHJvdmlkZXJzOiBbbGlmdGluZ0luc3RydWN0aW9uLnR5cGUudGFyZ2V0XVxuICAgICAgfSk7XG4gICAgfWVsc2V7XG4gICAgICBmb3IoaSA9IDAsIGlpID0gYmVoYXZpb3JJbnN0cnVjdGlvbnMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIGluc3RydWN0aW9uID0gYmVoYXZpb3JJbnN0cnVjdGlvbnNbaV07XG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUuY29tcGlsZSh0aGlzLCByZXNvdXJjZXMsIG5vZGUsIGluc3RydWN0aW9uLCBwYXJlbnROb2RlKTtcbiAgICAgICAgcHJvdmlkZXJzLnB1c2goaW5zdHJ1Y3Rpb24udHlwZS50YXJnZXQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5qZWN0b3JJZCA9IGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCA/IGdldE5leHRJbmplY3RvcklkKCkgOiBmYWxzZTtcblxuICAgICAgaWYoZXhwcmVzc2lvbnMubGVuZ3RoIHx8IGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCl7XG4gICAgICAgIG1ha2VJbnRvSW5zdHJ1Y3Rpb25UYXJnZXQobm9kZSk7XG4gICAgICAgIGluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICBhbmNob3JJc0NvbnRhaW5lcjogZWxlbWVudEluc3RydWN0aW9uID8gZWxlbWVudEluc3RydWN0aW9uLmFuY2hvcklzQ29udGFpbmVyIDogdHJ1ZSxcbiAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQ6ICEhZWxlbWVudEluc3RydWN0aW9uLFxuICAgICAgICAgIGluamVjdG9ySWQ6IGluamVjdG9ySWQsXG4gICAgICAgICAgcGFyZW50SW5qZWN0b3JJZDogcGFyZW50SW5qZWN0b3JJZCxcbiAgICAgICAgICBleHByZXNzaW9uczogZXhwcmVzc2lvbnMsXG4gICAgICAgICAgYmVoYXZpb3JJbnN0cnVjdGlvbnM6IGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZihlbGVtZW50SW5zdHJ1Y3Rpb24gJiYgZWxlbWVudEluc3RydWN0aW9uLnR5cGUuc2tpcENvbnRlbnRQcm9jZXNzaW5nKXtcbiAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICB3aGlsZSAoY3VycmVudENoaWxkKSB7XG4gICAgICAgIGN1cnJlbnRDaGlsZCA9IHRoaXMuY29tcGlsZU5vZGUoY3VycmVudENoaWxkLCByZXNvdXJjZXMsIGluc3RydWN0aW9ucywgbm9kZSwgaW5qZWN0b3JJZCB8fCBwYXJlbnRJbmplY3RvcklkLCB0YXJnZXRMaWdodERPTSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gIH1cbn1cbiJdfQ==